package Behavioral.Interpreter.inter;

//示例实现的功能就是类似于XPath的部分功能。

//要使用解释器模式，一个重要的前提就是要定义一套语法规则，也称为文法。不管这套文法的规则是简单还是复杂，必须有这么个东西，因为解释器模式就是来按照这些规则进行解析并执行相应的功能的。
//为表达式设计简单的文法

//为了通用，用root表示根元素，a、b、c、d等来代表元素，一个简单的xml如下：

//<');"1.0" encoding="UTF-8"');"rootId">
//<a>
//<b>
//<c name="testC">12345</c>
//<d id="1">d1</d>
//<d id="2">d2</d>
//<d id="3">d3</d>
//<d id="4">d4</d>
//</b>
//</a>
//</root>

//约定表达式的文法如下：
//**获取单个元素的值：**从根元素开始，一直到想要获取值的元素，元素中间用“/”分隔，根元素前不加“/”。比如表达式“root/a/b/c”就表示获取根元素下、a元素下、b元素下的c元素的值；
//**获取单个元素的属性的值：**要获取值的属性一定是表达式的最后一个元素的属性，在最后一个元素后面添加“.”然后再加上属性的名称。比如表达式“root/a/b/c.name”就表示获取根元素下、a元素下、b元素下、c元素的name属性的值；
//**获取相同元素名称的值，当然是多个：**要获取值的元素一定是表达式的最后一个元素，在最后一个元素后面添加“

//（1）定义抽象的解释器
//要实现解释器的功能，首先定义一个抽象的解释器，来约束所有被解释的语法对象，也就是节点元素和终结符元素都要实现的功能。示例代码如下：

/**
 * 用于处理自定义Xml取值表达式的接口
 */
public abstract class ReadXmlExpression {
    /**
     * 解释表达式
     * @param c 上下文
     * @return 解析过后的值，为了通用，可能是单个值，也可能是多个值，
     *         因此就返回一个数组
     */
    public abstract String[] interpret(Context c);
}
